// 如果要给某一个位置添加 对象的类型， 使用接口去解决文通
interface IUser {
  // 实际上就相当于你自己定义了一个数据类型
  firstName?: string; // 结尾 可以 什么也不写，也可以写为 ， 还可以写为;
  lastName?: string;
  [propName: string]: any; // 任意类型
}

const aa: IUser = { firstName: "1", lastName: "2", haha: "xixi", test: "测试" };

// 用接口定义函数的形状
interface IFn {
  (user: IUser): string;
}
const greeter1: IFn = (user: IUser): string => {
  return "hello" + user.firstName + " " + user.lastName;
};
console.log(greeter1({ firstName: "程", lastName: "诺" }));

// 参数默认值
function test(a: number, b: number = 10): number {
  return a + b;
}

// 重载允许一个函数接受不同数量或类型的参数时，作出不同的处理
// 利用联合类型 number | string
// function reverse (x: number | string): number | string {
//   if (typeof x === 'number') {
//     return Number(x.toString().split('').reverse().join(''))
//   } else {
//     return x.split('').reverse().join()
//   }
// }

// 上述不能够精确的表达，输入为数字的时候，输出也应该为数字，输入为字符串的时候，输出也应该为字符串。
// 使用重载定义多个 `reverse` 的函数类型
// TypeScript 会优先从最前面的函数定义开始匹配，
// 所以多个函数定义如果有包含关系，需要优先把精确的定义写在前面
function reverse(x: number): number; // 重载函数的定义
function reverse(x: string): string; // 重载函数的定义
function reverse(x: number | string): number | string {
  // 重载函数的实现
  if (typeof x === "number") {
    return Number(x.toString().split("").reverse().join(""));
  } else {
    return x.split("").reverse().join();
  }
}
